package controle;

import java.io.IOException;
import java.util.ArrayList;

import gerente.GerenteCD;
import gerente.GerenteDVD;
import gerente.GerenteLivro;
import gerente.GerenteMaterial;
import gerente.GerenteRevista;
import entidade.CD;
import entidade.DVD;
import entidade.Livro;
import entidade.Revista;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BuscaMaterialCommand implements Command
{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
	
		String info = request.getParameter("palavra-chave");
		String tipoMaterial = request.getParameter("material-tipo");
		GerenteMaterial gerenteMaterial = new GerenteMaterial();
		GerenteDVD gerenteDVD = new GerenteDVD();
		GerenteCD gerenteCD = new GerenteCD();
		GerenteLivro gerenteLivro = new GerenteLivro();
		GerenteRevista gerenteRevista = new GerenteRevista();
		ArrayList<DVD> listaDVD = new ArrayList<DVD>();
		ArrayList<CD> listaCD = new ArrayList<CD>();
		ArrayList<Livro> listaLivro = new ArrayList<Livro>();
		ArrayList<Revista> listaRevista = new ArrayList<Revista>();
		if (info != "")
		{
			if (tipoMaterial == "Material")
			{
				separaMateriaisporTipo(gerenteMaterial.searchOnAnyProperty(info), listaDVD, listaCD, listaLivro, listaRevista);
			}
			if (tipoMaterial == "DVD")
			{
				for (Object o: gerenteDVD.searchOnAnyProperty(info))
					if (o.getClass() == DVD.class)
					{
						listaDVD.add((DVD) o);
					}
			}
			if (tipoMaterial == "CD")
			{
				for (Object o: gerenteCD.searchOnAnyProperty(info))
					if (o.getClass() == CD.class)
					{
						listaCD.add((CD) o);
					}
			}
			if (tipoMaterial == "Livro")
			{
				for (Object o: gerenteLivro.searchOnAnyProperty(info))
					if (o.getClass() == Livro.class)
					{
						listaLivro.add((Livro) o);
					}
			}
			if (tipoMaterial == "Revista")
			{
				for (Object o: gerenteRevista.searchOnAnyProperty(info))
					if (o.getClass() == Revista.class)
					{
						listaRevista.add((Revista) o);
					}
			}
		}
		else //Para procurar todos os materiais daquele tipo selecionado
		{
			if(tipoMaterial == "Material")
			{
				ArrayList<Object> lista = gerenteMaterial.getListWithAllTheDataBD();
				separaMateriaisporTipo(lista, listaDVD, listaCD, listaLivro, listaRevista);	
			}
			if (tipoMaterial == "DVD")
			{
				for (Object o: gerenteDVD.getListWithAllTheDataBD())
					if (o.getClass() == DVD.class)
					{
						listaDVD.add((DVD) o);
					}
			}
			if (tipoMaterial == "CD")
			{
				for (Object o: gerenteCD.getListWithAllTheDataBD())
					if (o.getClass() == DVD.class)
					{
						listaCD.add((CD) o);
					}
			}
			if (tipoMaterial == "Livro")
			{
				for (Object o: gerenteLivro.getListWithAllTheDataBD())
					if (o.getClass() == Livro.class)
					{
						listaLivro.add((Livro) o);
					}
			}
			if (tipoMaterial == "Revista")
			{
				for (Object o: gerenteRevista.searchOnAnyProperty(info))
					if (o.getClass() == Revista.class)
					{
						listaRevista.add((Revista) o);
					}
			}
		}
		request.setAttribute("dvdList", listaDVD);
		request.setAttribute("cdList", listaCD);
		request.setAttribute("livroList", listaLivro);
		request.setAttribute("revistaList", listaRevista);			
		RequestDispatcher rd = null;
		System.out.println("LOG: Carregando Resultado.jsp");
		rd = request.getRequestDispatcher("/Busca/Resultado.jsp");
		try 
		{
			rd.forward(request, response);
		}
		catch (ServletException e) 
		{
			e.printStackTrace();
		} 
		catch (IOException e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return; 		
	}
	
	private void separaMateriaisporTipo(ArrayList<Object> lista, ArrayList<DVD> listaDVD, ArrayList<CD> listaCD, ArrayList<Livro> listaLivro, ArrayList<Revista> listaRevista)
	{
		for (Object o: lista)
		{
			if (o.getClass() == DVD.class)
			{
				listaDVD.add((DVD) o);
			}
			else if (o.getClass() == CD.class)
			{
				listaCD.add((CD) o);
			}	
			else if (o.getClass() == Livro.class)
			{
				listaLivro.add((Livro) o);
			}
			else if (o.getClass() == Revista.class)
			{
				listaRevista.add((Revista) o);
			}
		}
	}

}

